GitHub ActionsからECSとECRへのCI/CDを最小権限で実行したい
こんにちは!コンサル部のinomaso(@inomasosan)です。
前回、GitHub ActionsからECSのCI/CDについて試してみました。
その際、GitHub ActionsにはAWS管理ポリシーによる強めの権限を付与して検証しました。
本番運用を考慮する場合は、FullAccess等の強い権限だと思わぬ事故につながります。
今回はセキュリティの観点から、GitHub Actions用にIAMポリシーの最小権限例を作成してみました。
構成図
GitHub ActionsのDeploy to Amazon ECSテンプレートからワークフロー実行する際の大まかな構成図となります。
今回はIAMポリシーのAction
とResource
をメインに権限を見直していきます。
IAMポリシーの最小化権限例
今回作成したIAMポリシーは以下の通りです。
<>
で囲った値は、ご自身の環境毎の値に置き換えてください。
ECR用
GitHub ActionsでビルドしたコンテナイメージをECRにプッシュするための、IAMポリシーの最小権限を設定していきます。
今回はAWS公式ドキュメントのポリシー例である1 つの Amazon ECR リポジトリにアクセスするをベースにAction
とResource
を修正しました。
ecr:GetAuthorizationToken
はリソースレベルのアクセス許可をサポートしていないため、Resource
は * ですべてのリソースを選択する必要があります。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetAuthorizationToken", "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken" ], "Resource": "*" }, { "Sid": "PushImageOnly", "Effect": "Allow", "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload", "ecr:PutImage" ], "Resource": "arn:aws:ecr:ap-northeast-1:<AWSアカウントID>:repository/<リポジトリ名>" } ] }
ECS用
GitHub Actionsで更新したタスク定義をECSに登録し、サービスをアップデートするための、IAMポリシーの最小権限を設定していきます。
今回はAWS公式ドキュメントのポリシー例にあるAmazon ECS CodeDeploy IAM ロールをベースにAction
とResource
を修正しました。
ecs:RegisterTaskDefinition
はリソースレベルのアクセス許可をサポートしていないため、Resource
は * ですべてのリソースを選択する必要があります。
またiam:PassRole
は、ECSのアクションを実行する際にGitHub Actions用に作成したIAMではなく、ECSタスクに設定した既存のタスク実行ロールもしくはタスクロールが必要なため設定しています。
詳しくはAWS公式ドキュメントのiam:PassRole を実行する権限がないをご参照願います。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RegisterTaskDefinition", "Effect": "Allow", "Action": [ "ecs:RegisterTaskDefinition" ], "Resource": "*" }, { "Sid": "UpdateService", "Effect": "Allow", "Action": [ "ecs:UpdateServicePrimaryTaskSet", "ecs:DescribeServices", "ecs:UpdateService" ], "Resource": "arn:aws:ecs:ap-northeast-1:<AWSアカウントID>:service/httpd-cluster/<ECSサービス名>" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::<AWSアカウントID>:role/ecsTaskExecutionRole", "Condition": { "StringLike": { "iam:PassedToService": "ecs-tasks.amazonaws.com" } } } ] }
IAMポリシーの修正方法
上記のIAMポリシーは一発で設定できたわけではありません。 最低限必要なIAMポリシーを設定し、GitHub Actionsワークフローを何回も実行しながら、エラーメッセージを頼りに修正していきました。
最初はAction
から小さく試していきます。
ワークフローによるデプロイが失敗した場合は、以下のような詳細なエラーメッセージが出力されるため、トライ&エラーを繰り返して必要な権限を追加していきました。
エラーメッセージには具体的に修正すべきなAction
やResource
が表示されるため、修正はそこまで苦労しませんでした。
参考URL
まとめ
GitHub ActionsからECSとECRへCI/CDする際に、最低限必要なIAMポリシーをすぐに見つけられなかったので検証してみました。
この記事が、どなたかのお役に立てば幸いです。それでは!